 
package com.xbongbong.sys.domain.entity;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.xbongbong.paas.constant.PaasConstant;
import com.xbongbong.paas.toolbox.util.DateUtil;
import com.xbongbong.paas.toolbox.util.StringUtil;
import com.xbongbong.paas.toolbox.wrap.Entity;
import com.xbongbong.sys.enums.RoleEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author kaka
 * @time 2018-8-24
 */
@ToString
@Getter
@Setter
public class UserEntity extends Entity {

	private static final long serialVersionUID = 4623255506468285867L;
	private static final Logger LOG = LoggerFactory.getLogger(UserEntity.class);

	//========== properties ==========
	/**
	 * 优化innodb B+树，主键
	 */
	private Integer id;
	/**
	 * 公司ID
	 */
	private String corpid;
	/**
	 * 员工唯一标识ID（不可修改）
	 */
	private String userId;
	/**
	 * 手机号码
	 */
	private String mobile;
	/**
	 * 成员名称
	 */
	private String name;
	/**
	 * 是否已经激活, 1表示已激活, 0表示未激活
	 */
	private Integer active;
	/**
	 * 是否为企业的管理员, 1表示是, 0表示不是
	 */
	private Integer isAdmin;
	/**
	 * 是否为企业的老板, 1表示是, 0表示不是
	 */
	private Integer isBoss;
	/**
	 * 是否为仓库主管, 1表示是, 0表示不是
	 */
	private Integer isWarehouseManager;
	/**
	 * 钉钉Id
	 */
	private String dingId;
	/**
	 * 职位信息
	 */
	private String position;
	/**
	 * 头像url
	 */
	private String avatar;
	/**
	 * 员工工号
	 */
	private String jobnumber;
	/**
	 * 成员所属部门id列表
	 */
	private String department;
	/**
	 * 在对应的部门中的排序, Map结构的json字符串, key是部门的Id,
	 * value是人员在这个部门的排序值."orderInDepts" : "{1:10, 2:20}",
	 */
	private String orderInDepts;
	/**
	 * 	在对应的部门中是否为主管, Map结构的json字符串, key是部门的Id, value是人员在这个部门中是否为主管,
	 * 	true表示是, false表示不是."{1:true, 2:false}"
	 */
	private String isLeaderInDepts;
	/**
	 * 扩展属性，可以设置多种属性(但手机上最多只能显示10个扩展属性，具体显示哪些属性，
	 * 请到OA管理后台->设置->通讯录信息设置和OA管理后台->设置->手机端显示信息设置)性
	 */
	private String extattr;
	/**
	 * 添加时间
	 */
	private Integer addTime;
	/**
	 * 更新时间
	 */
	private Integer updateTime;
	/**
	 * 删除标记
	 */
	private Integer del;
	/**
	 * 新增员工角色字段
	 */
	private String roleIds;

	/**
	 * 是否接受推送消息,1推送，0不推送
	 */
	private Integer isPushMessage;
	/**
	 * 是否被授权使用销帮帮
	 */
	private Integer isVisible = 1;
	/**
	 * 关联passport实体id
	 */
	private Integer passportId;
	/**
	 * 邮箱
	 */
	private String email;

	/**
	 * 企业微信二维码url
	 */
	private String QRCode;

	//========== 扩展字段 ==========

	/**
	 * 是否主负责人
	 */
	private Integer isMain;

	/**
	 * 所拥有的角色名 对应roleIds
	 */
	private List<RoleEntity> roleList;
	
	private String roleName = "";
	
	private String belongDepartment = "";
	
	private String manageDepartment = "";

	private String departmentNames = "";
	/**
	 * 是否为当前首字母的第一个员工
	 */
	private Integer isFirstFp=0;

	/**
	 * 是否当前部门主管
	 */
	private Integer isLeader = 0;

	/**
	 * 员工所属的部门列表
 	 */
	private List<DepartmentEntity> depList;
	/**
	 * 用户的sessionId
	 */
	String sessionId = "";

	/**
	 * 公司名
	 */
	private String corpName = "";
    /**
     * 通过数据权限判断isBoss
     */
    private Boolean bossByDataPermission;

	/**
	 * 用户所有角色中的最高数据权限
	 */
	private Integer dataPermission;
	/**
	 * 精确到表单级的数据权限，{
	 *   "1_100":1,
	 *   "2_33":4,
	 *   ...
	 * }
	 * 格式说明：
	 * key值格式为：
	 * SaaS：saaSMark_businessType
	 * PaaS：saasMark_menuid
	 * value值为：各个角色的数据权限聚合，为各自表单的最高权限
	 */
	private Map<String, Integer> dataPermissionDetail;

	/**
	 * 标签，格式 [1,2]
	 */
	private JSONArray labels;

	public UserEntity() {
		int now = DateUtil.getInt();

		this.addTime = now;
		this.updateTime = now;
		this.del = 0;
		this.passportId = 0;
	}

	public void formatUserData(JSONObject userObject, Long depId, boolean insertUser) {
		
		//设置默认值
		if(this.isPushMessage == null) {
			this.isPushMessage = 1;
		}

		// 打印日志看看初始化时钉钉的返回值
		LOG.info("===userObject===" + userObject);
		this.userId = userObject.getString("userid");
		this.name = userObject.getString("name");
		this.active = "true".equals(userObject.getString("active")) ? 1 : 0;
		this.isAdmin = "true".equals(userObject.getString("isAdmin")) ? 1 : 0;
		this.isBoss = "true".equals(userObject.getString("isBoss")) ? 1 : 0;
		this.dingId = userObject.getString("dingId");
		this.position = userObject.getString("position") != null ? userObject.getString("position") : "";
		this.avatar = userObject.getString("avatar") != null ? userObject.getString("avatar") : "";
		this.jobnumber = userObject.getString("jobnumber") != null ? userObject.getString("jobnumber") : "";
		this.extattr = userObject.getString("extattr") != null ? userObject.getString("extattr") : "";
		
		this.name= StringUtil.filterEmoji(this.name);
		//更新修改时间
		int now = DateUtil.getInt();
		this.updateTime = now;
		
		if(depId == null) {
			this.orderInDepts = userObject.getString("orderInDepts");
			this.isLeaderInDepts = userObject.getString("isLeaderInDepts");
			this.department = userObject.getString("department");
		} else {
			this.department = userObject.getString("department");
			boolean isLeader = userObject.getBooleanValue("isLeader");
			Long order = userObject.getLong("order");
			
			Map<Long, Long> orderInDeptsJson = new HashMap<>(PaasConstant.DEFAULT_INITIAL_CAPACITY);
			orderInDeptsJson.put(depId, order);
			this.orderInDepts  = JSON.toJSONString(orderInDeptsJson);
			Map<Long, Boolean> isLeaderInDeptsJson = new HashMap<>(PaasConstant.DEFAULT_INITIAL_CAPACITY);
			isLeaderInDeptsJson.put(depId, isLeader);
			this.isLeaderInDepts = JSON.toJSONString(isLeaderInDeptsJson);
		}
		//插入时设置角色，更新时只有在用户没有isBoss权限或没有isAdmin权限的时候进行增加权限
		if(insertUser) {
			//设置角色
			if(this.isBoss.equals(1)) {
				//老板权限
				this.setRoleIds(RoleEnum.BOSS.getAlias());
			} else {
				if(isLeader()) {
					//主管
					this.setRoleIds(RoleEnum.MANAGER.getAlias());
				} else {
					//普通销售
					this.setRoleIds(RoleEnum.SALE.getAlias());
				}
			}
			
			//管理员权限
			if(this.isAdmin.equals(1)) {
				String fulRoleIds = this.getRoleIds() + RoleEnum.ADMIN.getCode() + "|";
				this.setRoleIds(fulRoleIds);
			}
		}
	}


	/**
	 * 判断是否是主管(仅用于钉钉同步到我们系统，我们自己系统中判断leader用userModel中的方法)
	 * @return
	 */
	public boolean isLeader() {
		if (StringUtil.isEmpty(this.isLeaderInDepts)) {
			return false;
		}
		Map<Long, Boolean> isLeaderMap = JSON.parseObject(this.isLeaderInDepts,  new TypeReference<Map<Long,Boolean>>(){});
		boolean isLeader = false;
		for(Map.Entry<Long, Boolean> isLeaderEntry : isLeaderMap.entrySet()) {
			//如果是某个部门主管就跳出
			if(isLeaderEntry.getValue()) {
				isLeader = true;
				break;
			}
		}
		return isLeader;
	}

	/**
	 * 判断当前user是否是管理员或老板，即是否符合roleIds包含|1|或|2|，这个判断与全公司权限datapermission=5不一样
	 * @return true 是， false 否
	 */
	public boolean isOriAdmin() {
		return this.roleIds.contains(RoleEnum.ADMIN.getAlias()) || this.roleIds.contains(RoleEnum.BOSS.getAlias());
	}

	//========== getters and setters ==========

	public String getAvatar() {
		if(StringUtil.isEmpty(this.avatar)){
			return "/images/default.jpg";
		}

		if(!this.avatar.startsWith("https") && this.avatar.startsWith("http")) {
			return this.avatar.replaceFirst("http", "https");
		}

		return avatar;
	}

	public List<Integer> roleIdsToList(){
		List<Integer> roleIdList = new ArrayList<>();
		String[] roleIdArray = roleIds.split("\\|");
		for(String roleId : roleIdArray) {
			roleIdList.add(StringUtil.toInt(roleId, 0));
		}
		if(roleIdList.size() == 0) {
			roleIdList.add(-1);
		}
		return roleIdList;
	}

	/**
	 * 	是否仓库主管
	 */
	public Integer getIsWarehouseManager() {
		String roles = this.roleIds;
		return (!StringUtil.isEmpty(roles) && roles.indexOf(RoleEnum.WAREHOUSE_MANAGER.getAlias()) > -1) ? 1 : 0;
	}

	public boolean isWarehouseManager(){
        return this.getIsWarehouseManager() == 1;
    }
    public Boolean getBossByDataPermission() {
        return bossByDataPermission;
    }

    public void setBossByDataPermission(Boolean bossByDataPermission) {
        this.bossByDataPermission = bossByDataPermission;
    }
}

